;void recortar(Uint8* sprite, Uint32 instancia, Uint32 ancho_instancia, Uint32 ancho_sprite, Uint32 alto_sprite, Uint8* res, bool orientacion);

%define p_sprite [ebp + 8]				; El puntero al Sprite del cual voy a sacar la instancia.
%define instancia [ebp + 12]			; El numero de instancia que quiero obtener.
%define ancho_instancia [ebp + 16]		; El ancho en pixeles de la instancia.
%define ancho_sprite [ebp + 20]			; El ancho en pixeles del Sprite donde se encuentran todas las instancias.
%define alto_sprite [ebp + 24]			; El alto en pixeles del sprite donde se encuentran todas las instancias.
%define p_res [ebp + 28]				; El puntero donde voy a devolver mi imagen resultante.
%define orientacion [ebp + 32]			; El sentido en el cual voy a obtener mi imagen de derecha a izquierda o de izaquierda a derecha.
%define der 1
%define rev 0
%define ancho_pixel 3

global recortar

section .text

recortar:
	push ebp
	mov ebp, esp
	push edi
	push esi
	push ebx
	
	mov esi, p_sprite ; Muevo el puntero del sprite a esi.
	mov edi, p_res ; Muevo el puntero del resultado a edi.
	
	;Posiciono a esi en el numero de instancia en el que estoy.
	mov eax, ancho_instancia ; Muevo a eax el ancho en pixeles de la instancia.
	lea ebx, [eax + 2 * eax] ; Calculo el ancho en bytes de la instancia y lo dejo en ebx.
	mov eax, ebx ; Muevo a eax el ancho en bytes de la instancia.
	mov ecx, instancia ; Muevo a ecx el numero de instancia que tengo que traer.
	mul ecx ; Multiplico el ancho en bytes de la instancia por el numero de instancia.
	add esi, eax ;  Sumo al puntero del sprite la cantidad de bytes que me tengo que mover para llegar al comienzo de la instancia en el sprite.
	
	mov eax, ancho_sprite ; Muevo el ancho en pixeles del sprite a eax.
	lea edx, [eax + 2 * eax] ; Calculo el ancho en bytes del sprite y lo dejo en edx.
	and eax, 3 ; Calculo la basura que tiene el sprite.
	add edx, eax ; Suma el ancho en bytes  del sprite con la basura que tiene.
	
	;Posiciono a esi en el lugar que me conviene dependiendo si es del derecho o del reves.
	mov eax, orientacion ; Muevo a eax la orientacion.
	cmp eax, der
	je derecho
		add esi, ebx
		sub esi, ancho_pixel
	derecho:
	
	mov ecx, alto_sprite ; Muevo a ecx el alto del sprite.
	
cicloFilas:
	push ecx
	;mov ecx, ebx
	;shr ecx, 2
	mov ecx, ancho_instancia
	push ebx
	push edx
	
	cicloColumnas:
		cmp ecx, 0
		je finCicloColumnas
		dec ecx
		
		muevo:
		mov edx, [esi]
		mov [edi], edx
		add edi, 3
		
		cmp eax, der
		je derecho2
			sub esi, ancho_pixel
			jmp cicloColumnas
		derecho2:
			add esi, ancho_pixel
			jmp cicloColumnas
	finCicloColumnas:
	mov ebx, ancho_instancia ; Muevo a ebx el ancho en pixeles de la instancia.
	and ebx, 3 ; Calculo la basura de la instancia.
	add edi, ebx ; Le sumo la basura al resultado.
	pop edx
	pop ebx
	
	cmp eax, der
	je derecho3
		add esi, ebx
		jmp sigo2
	derecho3:
		sub esi, ebx
	sigo2:
		add esi, edx ; Sumo el ancho en bytes del sprite mas la basura o sea posiciono en la siguiente fila.
		
	pop ecx
loop cicloFilas

fin:
	pop ebx
	pop esi
	pop edi
	pop ebp
	ret
